home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / xml / dom / minidom.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  60KB  |  2,125 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''minidom.py -- a lightweight DOM implementation.
  5.  
  6. parse("foo.xml")
  7.  
  8. parseString("<foo><bar/></foo>")
  9.  
  10. Todo:
  11. =====
  12.  * convenience methods for getting elements and text.
  13.  * more testing
  14.  * bring some of the writer and linearizer code into conformance with this
  15.         interface
  16.  * SAX 2 namespaces
  17. '''
  18. import xml.dom as xml
  19. from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg
  20. from xml.dom.minicompat import *
  21. from xml.dom.xmlbuilder import DOMImplementationLS, DocumentLS
  22. _TupleType = type(())
  23. _nodeTypes_with_children = (xml.dom.Node.ELEMENT_NODE, xml.dom.Node.ENTITY_REFERENCE_NODE)
  24.  
  25. class Node(xml.dom.Node, GetattrMagic):
  26.     namespaceURI = None
  27.     parentNode = None
  28.     ownerDocument = None
  29.     nextSibling = None
  30.     previousSibling = None
  31.     prefix = EMPTY_PREFIX
  32.     
  33.     def __nonzero__(self):
  34.         return True
  35.  
  36.     
  37.     def toxml(self, encoding = None):
  38.         return self.toprettyxml('', '', encoding)
  39.  
  40.     
  41.     def toprettyxml(self, indent = '\t', newl = '\n', encoding = None):
  42.         writer = _get_StringIO()
  43.         if encoding is not None:
  44.             import codecs as codecs
  45.             writer = codecs.lookup(encoding)[3](writer)
  46.         
  47.         if self.nodeType == Node.DOCUMENT_NODE:
  48.             self.writexml(writer, '', indent, newl, encoding)
  49.         else:
  50.             self.writexml(writer, '', indent, newl)
  51.         return writer.getvalue()
  52.  
  53.     
  54.     def hasChildNodes(self):
  55.         if self.childNodes:
  56.             return True
  57.         else:
  58.             return False
  59.  
  60.     
  61.     def _get_childNodes(self):
  62.         return self.childNodes
  63.  
  64.     
  65.     def _get_firstChild(self):
  66.         if self.childNodes:
  67.             return self.childNodes[0]
  68.         
  69.  
  70.     
  71.     def _get_lastChild(self):
  72.         if self.childNodes:
  73.             return self.childNodes[-1]
  74.         
  75.  
  76.     
  77.     def insertBefore(self, newChild, refChild):
  78.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  79.             for c in tuple(newChild.childNodes):
  80.                 self.insertBefore(c, refChild)
  81.             
  82.             return newChild
  83.         
  84.         if newChild.nodeType not in self._child_node_types:
  85.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  86.         
  87.         if newChild.parentNode is not None:
  88.             newChild.parentNode.removeChild(newChild)
  89.         
  90.         if refChild is None:
  91.             self.appendChild(newChild)
  92.         else:
  93.             
  94.             try:
  95.                 index = self.childNodes.index(refChild)
  96.             except ValueError:
  97.                 raise xml.dom.NotFoundErr()
  98.  
  99.             if newChild.nodeType in _nodeTypes_with_children:
  100.                 _clear_id_cache(self)
  101.             
  102.             self.childNodes.insert(index, newChild)
  103.             newChild.nextSibling = refChild
  104.             refChild.previousSibling = newChild
  105.             if index:
  106.                 node = self.childNodes[index - 1]
  107.                 node.nextSibling = newChild
  108.                 newChild.previousSibling = node
  109.             else:
  110.                 newChild.previousSibling = None
  111.             newChild.parentNode = self
  112.         return newChild
  113.  
  114.     
  115.     def appendChild(self, node):
  116.         if node.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  117.             for c in tuple(node.childNodes):
  118.                 self.appendChild(c)
  119.             
  120.             return node
  121.         
  122.         if node.nodeType not in self._child_node_types:
  123.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  124.         elif node.nodeType in _nodeTypes_with_children:
  125.             _clear_id_cache(self)
  126.         
  127.         if node.parentNode is not None:
  128.             node.parentNode.removeChild(node)
  129.         
  130.         _append_child(self, node)
  131.         node.nextSibling = None
  132.         return node
  133.  
  134.     
  135.     def replaceChild(self, newChild, oldChild):
  136.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  137.             refChild = oldChild.nextSibling
  138.             self.removeChild(oldChild)
  139.             return self.insertBefore(newChild, refChild)
  140.         
  141.         if newChild.nodeType not in self._child_node_types:
  142.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  143.         
  144.         if newChild.parentNode is not None:
  145.             newChild.parentNode.removeChild(newChild)
  146.         
  147.         if newChild is oldChild:
  148.             return None
  149.         
  150.         
  151.         try:
  152.             index = self.childNodes.index(oldChild)
  153.         except ValueError:
  154.             raise xml.dom.NotFoundErr()
  155.  
  156.         self.childNodes[index] = newChild
  157.         newChild.parentNode = self
  158.         oldChild.parentNode = None
  159.         if newChild.nodeType in _nodeTypes_with_children or oldChild.nodeType in _nodeTypes_with_children:
  160.             _clear_id_cache(self)
  161.         
  162.         newChild.nextSibling = oldChild.nextSibling
  163.         newChild.previousSibling = oldChild.previousSibling
  164.         oldChild.nextSibling = None
  165.         oldChild.previousSibling = None
  166.         if newChild.previousSibling:
  167.             newChild.previousSibling.nextSibling = newChild
  168.         
  169.         if newChild.nextSibling:
  170.             newChild.nextSibling.previousSibling = newChild
  171.         
  172.         return oldChild
  173.  
  174.     
  175.     def removeChild(self, oldChild):
  176.         
  177.         try:
  178.             self.childNodes.remove(oldChild)
  179.         except ValueError:
  180.             raise xml.dom.NotFoundErr()
  181.  
  182.         if oldChild.nextSibling is not None:
  183.             oldChild.nextSibling.previousSibling = oldChild.previousSibling
  184.         
  185.         if oldChild.previousSibling is not None:
  186.             oldChild.previousSibling.nextSibling = oldChild.nextSibling
  187.         
  188.         oldChild.nextSibling = None
  189.         oldChild.previousSibling = None
  190.         if oldChild.nodeType in _nodeTypes_with_children:
  191.             _clear_id_cache(self)
  192.         
  193.         oldChild.parentNode = None
  194.         return oldChild
  195.  
  196.     
  197.     def normalize(self):
  198.         L = []
  199.         for child in self.childNodes:
  200.             if child.nodeType == Node.TEXT_NODE:
  201.                 data = child.data
  202.                 if data and L and L[-1].nodeType == child.nodeType:
  203.                     node = L[-1]
  204.                     node.data = node.data + child.data
  205.                     node.nextSibling = child.nextSibling
  206.                     child.unlink()
  207.                 elif data:
  208.                     if L:
  209.                         L[-1].nextSibling = child
  210.                         child.previousSibling = L[-1]
  211.                     else:
  212.                         child.previousSibling = None
  213.                     L.append(child)
  214.                 else:
  215.                     child.unlink()
  216.             L[-1].nodeType == child.nodeType
  217.             if L:
  218.                 L[-1].nextSibling = child
  219.                 child.previousSibling = L[-1]
  220.             else:
  221.                 child.previousSibling = None
  222.             L.append(child)
  223.             if child.nodeType == Node.ELEMENT_NODE:
  224.                 child.normalize()
  225.                 continue
  226.         
  227.         self.childNodes[:] = L
  228.  
  229.     
  230.     def cloneNode(self, deep):
  231.         if not self.ownerDocument:
  232.             pass
  233.         return _clone_node(self, deep, self)
  234.  
  235.     
  236.     def isSupported(self, feature, version):
  237.         return self.ownerDocument.implementation.hasFeature(feature, version)
  238.  
  239.     
  240.     def _get_localName(self):
  241.         pass
  242.  
  243.     
  244.     def isSameNode(self, other):
  245.         return self is other
  246.  
  247.     
  248.     def getInterface(self, feature):
  249.         if self.isSupported(feature, None):
  250.             return self
  251.         else:
  252.             return None
  253.  
  254.     
  255.     def getUserData(self, key):
  256.         
  257.         try:
  258.             return self._user_data[key][0]
  259.         except (AttributeError, KeyError):
  260.             return None
  261.  
  262.  
  263.     
  264.     def setUserData(self, key, data, handler):
  265.         old = None
  266.         
  267.         try:
  268.             d = self._user_data
  269.         except AttributeError:
  270.             d = { }
  271.             self._user_data = d
  272.  
  273.         if d.has_key(key):
  274.             old = d[key][0]
  275.         
  276.         if data is None:
  277.             handler = None
  278.             if old is not None:
  279.                 del d[key]
  280.             
  281.         else:
  282.             d[key] = (data, handler)
  283.         return old
  284.  
  285.     
  286.     def _call_user_data_handler(self, operation, src, dst):
  287.         if hasattr(self, '_user_data'):
  288.             for data, handler in self._user_data.items():
  289.                 if handler is not None:
  290.                     handler.handle(operation, key, data, src, dst)
  291.                     continue
  292.             
  293.         
  294.  
  295.     
  296.     def unlink(self):
  297.         self.parentNode = None
  298.         self.ownerDocument = None
  299.         if self.childNodes:
  300.             for child in self.childNodes:
  301.                 child.unlink()
  302.             
  303.             self.childNodes = NodeList()
  304.         
  305.         self.previousSibling = None
  306.         self.nextSibling = None
  307.  
  308.  
  309. defproperty(Node, 'firstChild', doc = 'First child node, or None.')
  310. defproperty(Node, 'lastChild', doc = 'Last child node, or None.')
  311. defproperty(Node, 'localName', doc = 'Namespace-local name of this node.')
  312.  
  313. def _append_child(self, node):
  314.     childNodes = self.childNodes
  315.     if childNodes:
  316.         last = childNodes[-1]
  317.         node.__dict__['previousSibling'] = last
  318.         last.__dict__['nextSibling'] = node
  319.     
  320.     childNodes.append(node)
  321.     node.__dict__['parentNode'] = self
  322.  
  323.  
  324. def _in_document(node):
  325.     while node is not None:
  326.         if node.nodeType == Node.DOCUMENT_NODE:
  327.             return True
  328.         
  329.         node = node.parentNode
  330.     return False
  331.  
  332.  
  333. def _write_data(writer, data):
  334.     '''Writes datachars to writer.'''
  335.     data = data.replace('&', '&').replace('<', '<')
  336.     data = data.replace('"', '"').replace('>', '>')
  337.     writer.write(data)
  338.  
  339.  
  340. def _get_elements_by_tagName_helper(parent, name, rc):
  341.     for node in parent.childNodes:
  342.         if node.nodeType == Node.ELEMENT_NODE:
  343.             if name == '*' or node.tagName == name:
  344.                 rc.append(node)
  345.             
  346.         _get_elements_by_tagName_helper(node, name, rc)
  347.     
  348.     return rc
  349.  
  350.  
  351. def _get_elements_by_tagName_ns_helper(parent, nsURI, localName, rc):
  352.     for node in parent.childNodes:
  353.         if node.nodeType == Node.ELEMENT_NODE:
  354.             if localName == '*' or node.localName == localName:
  355.                 if nsURI == '*' or node.namespaceURI == nsURI:
  356.                     rc.append(node)
  357.                 
  358.             _get_elements_by_tagName_ns_helper(node, nsURI, localName, rc)
  359.             continue
  360.     
  361.     return rc
  362.  
  363.  
  364. class DocumentFragment(Node):
  365.     nodeType = Node.DOCUMENT_FRAGMENT_NODE
  366.     nodeName = '#document-fragment'
  367.     nodeValue = None
  368.     attributes = None
  369.     parentNode = None
  370.     _child_node_types = (Node.ELEMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.NOTATION_NODE)
  371.     
  372.     def __init__(self):
  373.         self.childNodes = NodeList()
  374.  
  375.  
  376.  
  377. class Attr(Node):
  378.     nodeType = Node.ATTRIBUTE_NODE
  379.     attributes = None
  380.     ownerElement = None
  381.     specified = False
  382.     _is_id = False
  383.     _child_node_types = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE)
  384.     
  385.     def __init__(self, qName, namespaceURI = EMPTY_NAMESPACE, localName = None, prefix = None):
  386.         d = self.__dict__
  387.         d['nodeName'] = d['name'] = qName
  388.         d['namespaceURI'] = namespaceURI
  389.         d['prefix'] = prefix
  390.         d['childNodes'] = NodeList()
  391.         self.childNodes.append(Text())
  392.  
  393.     
  394.     def _get_localName(self):
  395.         return self.nodeName.split(':', 1)[-1]
  396.  
  397.     
  398.     def _get_name(self):
  399.         return self.name
  400.  
  401.     
  402.     def _get_specified(self):
  403.         return self.specified
  404.  
  405.     
  406.     def __setattr__(self, name, value):
  407.         d = self.__dict__
  408.         if name in ('value', 'nodeValue'):
  409.             d['value'] = d['nodeValue'] = value
  410.             d2 = self.childNodes[0].__dict__
  411.             d2['data'] = d2['nodeValue'] = value
  412.             if self.ownerElement is not None:
  413.                 _clear_id_cache(self.ownerElement)
  414.             
  415.         elif name in ('name', 'nodeName'):
  416.             d['name'] = d['nodeName'] = value
  417.             if self.ownerElement is not None:
  418.                 _clear_id_cache(self.ownerElement)
  419.             
  420.         else:
  421.             d[name] = value
  422.  
  423.     
  424.     def _set_prefix(self, prefix):
  425.         nsuri = self.namespaceURI
  426.         if prefix == 'xmlns':
  427.             if nsuri and nsuri != XMLNS_NAMESPACE:
  428.                 raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix for the wrong namespace")
  429.             
  430.         
  431.         d = self.__dict__
  432.         d['prefix'] = prefix
  433.         if prefix is None:
  434.             newName = self.localName
  435.         else:
  436.             newName = '%s:%s' % (prefix, self.localName)
  437.         if self.ownerElement:
  438.             _clear_id_cache(self.ownerElement)
  439.         
  440.         d['nodeName'] = d['name'] = newName
  441.  
  442.     
  443.     def _set_value(self, value):
  444.         d = self.__dict__
  445.         d['value'] = d['nodeValue'] = value
  446.         if self.ownerElement:
  447.             _clear_id_cache(self.ownerElement)
  448.         
  449.         self.childNodes[0].data = value
  450.  
  451.     
  452.     def unlink(self):
  453.         elem = self.ownerElement
  454.         if elem is not None:
  455.             del elem._attrs[self.nodeName]
  456.             del elem._attrsNS[(self.namespaceURI, self.localName)]
  457.             if self._is_id:
  458.                 self._is_id = False
  459.                 elem._magic_id_nodes -= 1
  460.                 self.ownerDocument._magic_id_count -= 1
  461.             
  462.         
  463.         for child in self.childNodes:
  464.             child.unlink()
  465.         
  466.         del self.childNodes[:]
  467.  
  468.     
  469.     def _get_isId(self):
  470.         if self._is_id:
  471.             return True
  472.         
  473.         doc = self.ownerDocument
  474.         elem = self.ownerElement
  475.         if doc is None or elem is None:
  476.             return False
  477.         
  478.         info = doc._get_elem_info(elem)
  479.         if info is None:
  480.             return False
  481.         
  482.         if self.namespaceURI:
  483.             return info.isIdNS(self.namespaceURI, self.localName)
  484.         else:
  485.             return info.isId(self.nodeName)
  486.  
  487.     
  488.     def _get_schemaType(self):
  489.         doc = self.ownerDocument
  490.         elem = self.ownerElement
  491.         if doc is None or elem is None:
  492.             return _no_type
  493.         
  494.         info = doc._get_elem_info(elem)
  495.         if info is None:
  496.             return _no_type
  497.         
  498.         if self.namespaceURI:
  499.             return info.getAttributeTypeNS(self.namespaceURI, self.localName)
  500.         else:
  501.             return info.getAttributeType(self.nodeName)
  502.  
  503.  
  504. defproperty(Attr, 'isId', doc = 'True if this attribute is an ID.')
  505. defproperty(Attr, 'localName', doc = 'Namespace-local name of this attribute.')
  506. defproperty(Attr, 'schemaType', doc = 'Schema type for this attribute.')
  507.  
  508. class NamedNodeMap(NewStyle, GetattrMagic):
  509.     """The attribute list is a transient interface to the underlying
  510.     dictionaries.  Mutations here will change the underlying element's
  511.     dictionary.
  512.  
  513.     Ordering is imposed artificially and does not reflect the order of
  514.     attributes as found in an input document.
  515.     """
  516.     __slots__ = ('_attrs', '_attrsNS', '_ownerElement')
  517.     
  518.     def __init__(self, attrs, attrsNS, ownerElement):
  519.         self._attrs = attrs
  520.         self._attrsNS = attrsNS
  521.         self._ownerElement = ownerElement
  522.  
  523.     
  524.     def _get_length(self):
  525.         return len(self._attrs)
  526.  
  527.     
  528.     def item(self, index):
  529.         
  530.         try:
  531.             return self[self._attrs.keys()[index]]
  532.         except IndexError:
  533.             return None
  534.  
  535.  
  536.     
  537.     def items(self):
  538.         L = []
  539.         for node in self._attrs.values():
  540.             L.append((node.nodeName, node.value))
  541.         
  542.         return L
  543.  
  544.     
  545.     def itemsNS(self):
  546.         L = []
  547.         for node in self._attrs.values():
  548.             L.append(((node.namespaceURI, node.localName), node.value))
  549.         
  550.         return L
  551.  
  552.     
  553.     def has_key(self, key):
  554.         if isinstance(key, StringTypes):
  555.             return self._attrs.has_key(key)
  556.         else:
  557.             return self._attrsNS.has_key(key)
  558.  
  559.     
  560.     def keys(self):
  561.         return self._attrs.keys()
  562.  
  563.     
  564.     def keysNS(self):
  565.         return self._attrsNS.keys()
  566.  
  567.     
  568.     def values(self):
  569.         return self._attrs.values()
  570.  
  571.     
  572.     def get(self, name, value = None):
  573.         return self._attrs.get(name, value)
  574.  
  575.     __len__ = _get_length
  576.     
  577.     def __cmp__(self, other):
  578.         if self._attrs is getattr(other, '_attrs', None):
  579.             return 0
  580.         else:
  581.             return cmp(id(self), id(other))
  582.  
  583.     
  584.     def __getitem__(self, attname_or_tuple):
  585.         if isinstance(attname_or_tuple, _TupleType):
  586.             return self._attrsNS[attname_or_tuple]
  587.         else:
  588.             return self._attrs[attname_or_tuple]
  589.  
  590.     
  591.     def __setitem__(self, attname, value):
  592.         if isinstance(value, StringTypes):
  593.             
  594.             try:
  595.                 node = self._attrs[attname]
  596.             except KeyError:
  597.                 node = Attr(attname)
  598.                 node.ownerDocument = self._ownerElement.ownerDocument
  599.                 self.setNamedItem(node)
  600.  
  601.             node.value = value
  602.         elif not isinstance(value, Attr):
  603.             raise TypeError, 'value must be a string or Attr object'
  604.         
  605.         node = value
  606.         self.setNamedItem(node)
  607.  
  608.     
  609.     def getNamedItem(self, name):
  610.         
  611.         try:
  612.             return self._attrs[name]
  613.         except KeyError:
  614.             return None
  615.  
  616.  
  617.     
  618.     def getNamedItemNS(self, namespaceURI, localName):
  619.         
  620.         try:
  621.             return self._attrsNS[(namespaceURI, localName)]
  622.         except KeyError:
  623.             return None
  624.  
  625.  
  626.     
  627.     def removeNamedItem(self, name):
  628.         n = self.getNamedItem(name)
  629.         if n is not None:
  630.             _clear_id_cache(self._ownerElement)
  631.             del self._attrs[n.nodeName]
  632.             del self._attrsNS[(n.namespaceURI, n.localName)]
  633.             if n.__dict__.has_key('ownerElement'):
  634.                 n.__dict__['ownerElement'] = None
  635.             
  636.             return n
  637.         else:
  638.             raise xml.dom.NotFoundErr()
  639.  
  640.     
  641.     def removeNamedItemNS(self, namespaceURI, localName):
  642.         n = self.getNamedItemNS(namespaceURI, localName)
  643.         if n is not None:
  644.             _clear_id_cache(self._ownerElement)
  645.             del self._attrsNS[(n.namespaceURI, n.localName)]
  646.             del self._attrs[n.nodeName]
  647.             if n.__dict__.has_key('ownerElement'):
  648.                 n.__dict__['ownerElement'] = None
  649.             
  650.             return n
  651.         else:
  652.             raise xml.dom.NotFoundErr()
  653.  
  654.     
  655.     def setNamedItem(self, node):
  656.         if not isinstance(node, Attr):
  657.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  658.         
  659.         old = self._attrs.get(node.name)
  660.         if old:
  661.             old.unlink()
  662.         
  663.         self._attrs[node.name] = node
  664.         self._attrsNS[(node.namespaceURI, node.localName)] = node
  665.         node.ownerElement = self._ownerElement
  666.         _clear_id_cache(node.ownerElement)
  667.         return old
  668.  
  669.     
  670.     def setNamedItemNS(self, node):
  671.         return self.setNamedItem(node)
  672.  
  673.     
  674.     def __delitem__(self, attname_or_tuple):
  675.         node = self[attname_or_tuple]
  676.         _clear_id_cache(node.ownerElement)
  677.         node.unlink()
  678.  
  679.     
  680.     def __getstate__(self):
  681.         return (self._attrs, self._attrsNS, self._ownerElement)
  682.  
  683.     
  684.     def __setstate__(self, state):
  685.         (self._attrs, self._attrsNS, self._ownerElement) = state
  686.  
  687.  
  688. defproperty(NamedNodeMap, 'length', doc = 'Number of nodes in the NamedNodeMap.')
  689. AttributeList = NamedNodeMap
  690.  
  691. class TypeInfo(NewStyle):
  692.     __slots__ = ('namespace', 'name')
  693.     
  694.     def __init__(self, namespace, name):
  695.         self.namespace = namespace
  696.         self.name = name
  697.  
  698.     
  699.     def __repr__(self):
  700.         if self.namespace:
  701.             return '<TypeInfo %r (from %r)>' % (self.name, self.namespace)
  702.         else:
  703.             return '<TypeInfo %r>' % self.name
  704.  
  705.     
  706.     def _get_name(self):
  707.         return self.name
  708.  
  709.     
  710.     def _get_namespace(self):
  711.         return self.namespace
  712.  
  713.  
  714. _no_type = TypeInfo(None, None)
  715.  
  716. class Element(Node):
  717.     nodeType = Node.ELEMENT_NODE
  718.     nodeValue = None
  719.     schemaType = _no_type
  720.     _magic_id_nodes = 0
  721.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE)
  722.     
  723.     def __init__(self, tagName, namespaceURI = EMPTY_NAMESPACE, prefix = None, localName = None):
  724.         self.tagName = self.nodeName = tagName
  725.         self.prefix = prefix
  726.         self.namespaceURI = namespaceURI
  727.         self.childNodes = NodeList()
  728.         self._attrs = { }
  729.         self._attrsNS = { }
  730.  
  731.     
  732.     def _get_localName(self):
  733.         return self.tagName.split(':', 1)[-1]
  734.  
  735.     
  736.     def _get_tagName(self):
  737.         return self.tagName
  738.  
  739.     
  740.     def unlink(self):
  741.         for attr in self._attrs.values():
  742.             attr.unlink()
  743.         
  744.         self._attrs = None
  745.         self._attrsNS = None
  746.         Node.unlink(self)
  747.  
  748.     
  749.     def getAttribute(self, attname):
  750.         
  751.         try:
  752.             return self._attrs[attname].value
  753.         except KeyError:
  754.             return ''
  755.  
  756.  
  757.     
  758.     def getAttributeNS(self, namespaceURI, localName):
  759.         
  760.         try:
  761.             return self._attrsNS[(namespaceURI, localName)].value
  762.         except KeyError:
  763.             return ''
  764.  
  765.  
  766.     
  767.     def setAttribute(self, attname, value):
  768.         attr = self.getAttributeNode(attname)
  769.         if attr is None:
  770.             attr = Attr(attname)
  771.             d = attr.__dict__
  772.             d['value'] = d['nodeValue'] = value
  773.             d['ownerDocument'] = self.ownerDocument
  774.             self.setAttributeNode(attr)
  775.         elif value != attr.value:
  776.             d = attr.__dict__
  777.             d['value'] = d['nodeValue'] = value
  778.             if attr.isId:
  779.                 _clear_id_cache(self)
  780.             
  781.         
  782.  
  783.     
  784.     def setAttributeNS(self, namespaceURI, qualifiedName, value):
  785.         (prefix, localname) = _nssplit(qualifiedName)
  786.         attr = self.getAttributeNodeNS(namespaceURI, localname)
  787.         if attr is None:
  788.             attr = Attr(qualifiedName, namespaceURI, localname, prefix)
  789.             d = attr.__dict__
  790.             d['prefix'] = prefix
  791.             d['nodeName'] = qualifiedName
  792.             d['value'] = d['nodeValue'] = value
  793.             d['ownerDocument'] = self.ownerDocument
  794.             self.setAttributeNode(attr)
  795.         else:
  796.             d = attr.__dict__
  797.             if value != attr.value:
  798.                 d['value'] = d['nodeValue'] = value
  799.                 if attr.isId:
  800.                     _clear_id_cache(self)
  801.                 
  802.             
  803.             if attr.prefix != prefix:
  804.                 d['prefix'] = prefix
  805.                 d['nodeName'] = qualifiedName
  806.             
  807.  
  808.     
  809.     def getAttributeNode(self, attrname):
  810.         return self._attrs.get(attrname)
  811.  
  812.     
  813.     def getAttributeNodeNS(self, namespaceURI, localName):
  814.         return self._attrsNS.get((namespaceURI, localName))
  815.  
  816.     
  817.     def setAttributeNode(self, attr):
  818.         if attr.ownerElement not in (None, self):
  819.             raise xml.dom.InuseAttributeErr('attribute node already owned')
  820.         
  821.         old1 = self._attrs.get(attr.name, None)
  822.         if old1 is not None:
  823.             self.removeAttributeNode(old1)
  824.         
  825.         old2 = self._attrsNS.get((attr.namespaceURI, attr.localName), None)
  826.         if old2 is not None and old2 is not old1:
  827.             self.removeAttributeNode(old2)
  828.         
  829.         _set_attribute_node(self, attr)
  830.         if old1 is not attr:
  831.             return old1
  832.         
  833.         if old2 is not attr:
  834.             return old2
  835.         
  836.  
  837.     setAttributeNodeNS = setAttributeNode
  838.     
  839.     def removeAttribute(self, name):
  840.         
  841.         try:
  842.             attr = self._attrs[name]
  843.         except KeyError:
  844.             raise xml.dom.NotFoundErr()
  845.  
  846.         self.removeAttributeNode(attr)
  847.  
  848.     
  849.     def removeAttributeNS(self, namespaceURI, localName):
  850.         
  851.         try:
  852.             attr = self._attrsNS[(namespaceURI, localName)]
  853.         except KeyError:
  854.             raise xml.dom.NotFoundErr()
  855.  
  856.         self.removeAttributeNode(attr)
  857.  
  858.     
  859.     def removeAttributeNode(self, node):
  860.         if node is None:
  861.             raise xml.dom.NotFoundErr()
  862.         
  863.         
  864.         try:
  865.             self._attrs[node.name]
  866.         except KeyError:
  867.             raise xml.dom.NotFoundErr()
  868.  
  869.         _clear_id_cache(self)
  870.         node.unlink()
  871.         node.ownerDocument = self.ownerDocument
  872.  
  873.     removeAttributeNodeNS = removeAttributeNode
  874.     
  875.     def hasAttribute(self, name):
  876.         return self._attrs.has_key(name)
  877.  
  878.     
  879.     def hasAttributeNS(self, namespaceURI, localName):
  880.         return self._attrsNS.has_key((namespaceURI, localName))
  881.  
  882.     
  883.     def getElementsByTagName(self, name):
  884.         return _get_elements_by_tagName_helper(self, name, NodeList())
  885.  
  886.     
  887.     def getElementsByTagNameNS(self, namespaceURI, localName):
  888.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  889.  
  890.     
  891.     def __repr__(self):
  892.         return '<DOM Element: %s at %#x>' % (self.tagName, id(self))
  893.  
  894.     
  895.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  896.         writer.write(indent + '<' + self.tagName)
  897.         attrs = self._get_attributes()
  898.         a_names = attrs.keys()
  899.         a_names.sort()
  900.         for a_name in a_names:
  901.             writer.write(' %s="' % a_name)
  902.             _write_data(writer, attrs[a_name].value)
  903.             writer.write('"')
  904.         
  905.         if self.childNodes:
  906.             writer.write('>%s' % newl)
  907.             for node in self.childNodes:
  908.                 node.writexml(writer, indent + addindent, addindent, newl)
  909.             
  910.             writer.write('%s</%s>%s' % (indent, self.tagName, newl))
  911.         else:
  912.             writer.write('/>%s' % newl)
  913.  
  914.     
  915.     def _get_attributes(self):
  916.         return NamedNodeMap(self._attrs, self._attrsNS, self)
  917.  
  918.     
  919.     def hasAttributes(self):
  920.         if self._attrs:
  921.             return True
  922.         else:
  923.             return False
  924.  
  925.     
  926.     def setIdAttribute(self, name):
  927.         idAttr = self.getAttributeNode(name)
  928.         self.setIdAttributeNode(idAttr)
  929.  
  930.     
  931.     def setIdAttributeNS(self, namespaceURI, localName):
  932.         idAttr = self.getAttributeNodeNS(namespaceURI, localName)
  933.         self.setIdAttributeNode(idAttr)
  934.  
  935.     
  936.     def setIdAttributeNode(self, idAttr):
  937.         if idAttr is None or not self.isSameNode(idAttr.ownerElement):
  938.             raise xml.dom.NotFoundErr()
  939.         
  940.         if _get_containing_entref(self) is not None:
  941.             raise xml.dom.NoModificationAllowedErr()
  942.         
  943.  
  944.  
  945. defproperty(Element, 'attributes', doc = 'NamedNodeMap of attributes on the element.')
  946. defproperty(Element, 'localName', doc = 'Namespace-local name of this element.')
  947.  
  948. def _set_attribute_node(element, attr):
  949.     _clear_id_cache(element)
  950.     element._attrs[attr.name] = attr
  951.     element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
  952.     attr.__dict__['ownerElement'] = element
  953.  
  954.  
  955. class Childless:
  956.     '''Mixin that makes childless-ness easy to implement and avoids
  957.     the complexity of the Node methods that deal with children.
  958.     '''
  959.     attributes = None
  960.     childNodes = EmptyNodeList()
  961.     firstChild = None
  962.     lastChild = None
  963.     
  964.     def _get_firstChild(self):
  965.         pass
  966.  
  967.     
  968.     def _get_lastChild(self):
  969.         pass
  970.  
  971.     
  972.     def appendChild(self, node):
  973.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes cannot have children')
  974.  
  975.     
  976.     def hasChildNodes(self):
  977.         return False
  978.  
  979.     
  980.     def insertBefore(self, newChild, refChild):
  981.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  982.  
  983.     
  984.     def removeChild(self, oldChild):
  985.         raise xml.dom.NotFoundErr(self.nodeName + ' nodes do not have children')
  986.  
  987.     
  988.     def replaceChild(self, newChild, oldChild):
  989.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  990.  
  991.  
  992.  
  993. class ProcessingInstruction(Childless, Node):
  994.     nodeType = Node.PROCESSING_INSTRUCTION_NODE
  995.     
  996.     def __init__(self, target, data):
  997.         self.target = self.nodeName = target
  998.         self.data = self.nodeValue = data
  999.  
  1000.     
  1001.     def _get_data(self):
  1002.         return self.data
  1003.  
  1004.     
  1005.     def _set_data(self, value):
  1006.         d = self.__dict__
  1007.         d['data'] = d['nodeValue'] = value
  1008.  
  1009.     
  1010.     def _get_target(self):
  1011.         return self.target
  1012.  
  1013.     
  1014.     def _set_target(self, value):
  1015.         d = self.__dict__
  1016.         d['target'] = d['nodeName'] = value
  1017.  
  1018.     
  1019.     def __setattr__(self, name, value):
  1020.         if name == 'data' or name == 'nodeValue':
  1021.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1022.         elif name == 'target' or name == 'nodeName':
  1023.             self.__dict__['target'] = self.__dict__['nodeName'] = value
  1024.         else:
  1025.             self.__dict__[name] = value
  1026.  
  1027.     
  1028.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1029.         writer.write('%s<?%s %s?>%s' % (indent, self.target, self.data, newl))
  1030.  
  1031.  
  1032.  
  1033. class CharacterData(Childless, Node):
  1034.     
  1035.     def _get_length(self):
  1036.         return len(self.data)
  1037.  
  1038.     __len__ = _get_length
  1039.     
  1040.     def _get_data(self):
  1041.         return self.__dict__['data']
  1042.  
  1043.     
  1044.     def _set_data(self, data):
  1045.         d = self.__dict__
  1046.         d['data'] = d['nodeValue'] = data
  1047.  
  1048.     _get_nodeValue = _get_data
  1049.     _set_nodeValue = _set_data
  1050.     
  1051.     def __setattr__(self, name, value):
  1052.         if name == 'data' or name == 'nodeValue':
  1053.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1054.         else:
  1055.             self.__dict__[name] = value
  1056.  
  1057.     
  1058.     def __repr__(self):
  1059.         data = self.data
  1060.         if len(data) > 10:
  1061.             dotdotdot = '...'
  1062.         else:
  1063.             dotdotdot = ''
  1064.         return '<DOM %s node "%s%s">' % (self.__class__.__name__, data[0:10], dotdotdot)
  1065.  
  1066.     
  1067.     def substringData(self, offset, count):
  1068.         if offset < 0:
  1069.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1070.         
  1071.         if offset >= len(self.data):
  1072.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1073.         
  1074.         if count < 0:
  1075.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1076.         
  1077.         return self.data[offset:offset + count]
  1078.  
  1079.     
  1080.     def appendData(self, arg):
  1081.         self.data = self.data + arg
  1082.  
  1083.     
  1084.     def insertData(self, offset, arg):
  1085.         if offset < 0:
  1086.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1087.         
  1088.         if offset >= len(self.data):
  1089.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1090.         
  1091.         if arg:
  1092.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset:])
  1093.         
  1094.  
  1095.     
  1096.     def deleteData(self, offset, count):
  1097.         if offset < 0:
  1098.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1099.         
  1100.         if offset >= len(self.data):
  1101.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1102.         
  1103.         if count < 0:
  1104.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1105.         
  1106.         if count:
  1107.             self.data = self.data[:offset] + self.data[offset + count:]
  1108.         
  1109.  
  1110.     
  1111.     def replaceData(self, offset, count, arg):
  1112.         if offset < 0:
  1113.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1114.         
  1115.         if offset >= len(self.data):
  1116.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1117.         
  1118.         if count < 0:
  1119.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1120.         
  1121.         if count:
  1122.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset + count:])
  1123.         
  1124.  
  1125.  
  1126. defproperty(CharacterData, 'length', doc = 'Length of the string data.')
  1127.  
  1128. class Text(CharacterData):
  1129.     nodeType = Node.TEXT_NODE
  1130.     nodeName = '#text'
  1131.     attributes = None
  1132.     
  1133.     def splitText(self, offset):
  1134.         if offset < 0 or offset > len(self.data):
  1135.             raise xml.dom.IndexSizeErr('illegal offset value')
  1136.         
  1137.         newText = self.__class__()
  1138.         newText.data = self.data[offset:]
  1139.         newText.ownerDocument = self.ownerDocument
  1140.         next = self.nextSibling
  1141.         if self.parentNode and self in self.parentNode.childNodes:
  1142.             if next is None:
  1143.                 self.parentNode.appendChild(newText)
  1144.             else:
  1145.                 self.parentNode.insertBefore(newText, next)
  1146.         
  1147.         self.data = self.data[:offset]
  1148.         return newText
  1149.  
  1150.     
  1151.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1152.         _write_data(writer, '%s%s%s' % (indent, self.data, newl))
  1153.  
  1154.     
  1155.     def _get_wholeText(self):
  1156.         L = [
  1157.             self.data]
  1158.         n = self.previousSibling
  1159.         while n is not None:
  1160.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1161.                 L.insert(0, n.data)
  1162.                 n = n.previousSibling
  1163.                 continue
  1164.             break
  1165.         n = self.nextSibling
  1166.         while n is not None:
  1167.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1168.                 L.append(n.data)
  1169.                 n = n.nextSibling
  1170.                 continue
  1171.             break
  1172.         return ''.join(L)
  1173.  
  1174.     
  1175.     def replaceWholeText(self, content):
  1176.         parent = self.parentNode
  1177.         n = self.previousSibling
  1178.         while n is not None:
  1179.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1180.                 next = n.previousSibling
  1181.                 parent.removeChild(n)
  1182.                 n = next
  1183.                 continue
  1184.             break
  1185.         n = self.nextSibling
  1186.         if not content:
  1187.             parent.removeChild(self)
  1188.         
  1189.         while n is not None:
  1190.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1191.                 next = n.nextSibling
  1192.                 parent.removeChild(n)
  1193.                 n = next
  1194.                 continue
  1195.             break
  1196.         if content:
  1197.             d = self.__dict__
  1198.             d['data'] = content
  1199.             d['nodeValue'] = content
  1200.             return self
  1201.         else:
  1202.             return None
  1203.  
  1204.     
  1205.     def _get_isWhitespaceInElementContent(self):
  1206.         if self.data.strip():
  1207.             return False
  1208.         
  1209.         elem = _get_containing_element(self)
  1210.         if elem is None:
  1211.             return False
  1212.         
  1213.         info = self.ownerDocument._get_elem_info(elem)
  1214.         if info is None:
  1215.             return False
  1216.         else:
  1217.             return info.isElementContent()
  1218.  
  1219.  
  1220. defproperty(Text, 'isWhitespaceInElementContent', doc = 'True iff this text node contains only whitespace and is in element content.')
  1221. defproperty(Text, 'wholeText', doc = 'The text of all logically-adjacent text nodes.')
  1222.  
  1223. def _get_containing_element(node):
  1224.     c = node.parentNode
  1225.     while c is not None:
  1226.         if c.nodeType == Node.ELEMENT_NODE:
  1227.             return c
  1228.         
  1229.         c = c.parentNode
  1230.  
  1231.  
  1232. def _get_containing_entref(node):
  1233.     c = node.parentNode
  1234.     while c is not None:
  1235.         if c.nodeType == Node.ENTITY_REFERENCE_NODE:
  1236.             return c
  1237.         
  1238.         c = c.parentNode
  1239.  
  1240.  
  1241. class Comment(Childless, CharacterData):
  1242.     nodeType = Node.COMMENT_NODE
  1243.     nodeName = '#comment'
  1244.     
  1245.     def __init__(self, data):
  1246.         self.data = self.nodeValue = data
  1247.  
  1248.     
  1249.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1250.         writer.write('%s<!--%s-->%s' % (indent, self.data, newl))
  1251.  
  1252.  
  1253.  
  1254. class CDATASection(Text):
  1255.     nodeType = Node.CDATA_SECTION_NODE
  1256.     nodeName = '#cdata-section'
  1257.     
  1258.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1259.         if self.data.find(']]>') >= 0:
  1260.             raise ValueError("']]>' not allowed in a CDATA section")
  1261.         
  1262.         writer.write('<![CDATA[%s]]>' % self.data)
  1263.  
  1264.  
  1265.  
  1266. class ReadOnlySequentialNamedNodeMap(NewStyle, GetattrMagic):
  1267.     __slots__ = ('_seq',)
  1268.     
  1269.     def __init__(self, seq = ()):
  1270.         self._seq = seq
  1271.  
  1272.     
  1273.     def __len__(self):
  1274.         return len(self._seq)
  1275.  
  1276.     
  1277.     def _get_length(self):
  1278.         return len(self._seq)
  1279.  
  1280.     
  1281.     def getNamedItem(self, name):
  1282.         for n in self._seq:
  1283.             if n.nodeName == name:
  1284.                 return n
  1285.                 continue
  1286.         
  1287.  
  1288.     
  1289.     def getNamedItemNS(self, namespaceURI, localName):
  1290.         for n in self._seq:
  1291.             if n.namespaceURI == namespaceURI and n.localName == localName:
  1292.                 return n
  1293.                 continue
  1294.         
  1295.  
  1296.     
  1297.     def __getitem__(self, name_or_tuple):
  1298.         if isinstance(name_or_tuple, _TupleType):
  1299.             node = self.getNamedItemNS(*name_or_tuple)
  1300.         else:
  1301.             node = self.getNamedItem(name_or_tuple)
  1302.         if node is None:
  1303.             raise KeyError, name_or_tuple
  1304.         
  1305.         return node
  1306.  
  1307.     
  1308.     def item(self, index):
  1309.         if index < 0:
  1310.             return None
  1311.         
  1312.         
  1313.         try:
  1314.             return self._seq[index]
  1315.         except IndexError:
  1316.             return None
  1317.  
  1318.  
  1319.     
  1320.     def removeNamedItem(self, name):
  1321.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1322.  
  1323.     
  1324.     def removeNamedItemNS(self, namespaceURI, localName):
  1325.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1326.  
  1327.     
  1328.     def setNamedItem(self, node):
  1329.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1330.  
  1331.     
  1332.     def setNamedItemNS(self, node):
  1333.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1334.  
  1335.     
  1336.     def __getstate__(self):
  1337.         return [
  1338.             self._seq]
  1339.  
  1340.     
  1341.     def __setstate__(self, state):
  1342.         self._seq = state[0]
  1343.  
  1344.  
  1345. defproperty(ReadOnlySequentialNamedNodeMap, 'length', doc = 'Number of entries in the NamedNodeMap.')
  1346.  
  1347. class Identified:
  1348.     '''Mix-in class that supports the publicId and systemId attributes.'''
  1349.     
  1350.     def _identified_mixin_init(self, publicId, systemId):
  1351.         self.publicId = publicId
  1352.         self.systemId = systemId
  1353.  
  1354.     
  1355.     def _get_publicId(self):
  1356.         return self.publicId
  1357.  
  1358.     
  1359.     def _get_systemId(self):
  1360.         return self.systemId
  1361.  
  1362.  
  1363.  
  1364. class DocumentType(Identified, Childless, Node):
  1365.     nodeType = Node.DOCUMENT_TYPE_NODE
  1366.     nodeValue = None
  1367.     name = None
  1368.     publicId = None
  1369.     systemId = None
  1370.     internalSubset = None
  1371.     
  1372.     def __init__(self, qualifiedName):
  1373.         self.entities = ReadOnlySequentialNamedNodeMap()
  1374.         self.notations = ReadOnlySequentialNamedNodeMap()
  1375.         if qualifiedName:
  1376.             (prefix, localname) = _nssplit(qualifiedName)
  1377.             self.name = localname
  1378.         
  1379.         self.nodeName = self.name
  1380.  
  1381.     
  1382.     def _get_internalSubset(self):
  1383.         return self.internalSubset
  1384.  
  1385.     
  1386.     def cloneNode(self, deep):
  1387.         if self.ownerDocument is None:
  1388.             clone = DocumentType(None)
  1389.             clone.name = self.name
  1390.             clone.nodeName = self.name
  1391.             operation = xml.dom.UserDataHandler.NODE_CLONED
  1392.             if deep:
  1393.                 clone.entities._seq = []
  1394.                 clone.notations._seq = []
  1395.                 for n in self.notations._seq:
  1396.                     notation = Notation(n.nodeName, n.publicId, n.systemId)
  1397.                     clone.notations._seq.append(notation)
  1398.                     n._call_user_data_handler(operation, n, notation)
  1399.                 
  1400.                 for e in self.entities._seq:
  1401.                     entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1402.                     entity.actualEncoding = e.actualEncoding
  1403.                     entity.encoding = e.encoding
  1404.                     entity.version = e.version
  1405.                     clone.entities._seq.append(entity)
  1406.                     e._call_user_data_handler(operation, n, entity)
  1407.                 
  1408.             
  1409.             self._call_user_data_handler(operation, self, clone)
  1410.             return clone
  1411.         else:
  1412.             return None
  1413.  
  1414.     
  1415.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1416.         writer.write('<!DOCTYPE ')
  1417.         writer.write(self.name)
  1418.         if self.publicId:
  1419.             writer.write("%s  PUBLIC '%s'%s  '%s'" % (newl, self.publicId, newl, self.systemId))
  1420.         elif self.systemId:
  1421.             writer.write("%s  SYSTEM '%s'" % (newl, self.systemId))
  1422.         
  1423.         if self.internalSubset is not None:
  1424.             writer.write(' [')
  1425.             writer.write(self.internalSubset)
  1426.             writer.write(']')
  1427.         
  1428.         writer.write('>' + newl)
  1429.  
  1430.  
  1431.  
  1432. class Entity(Identified, Node):
  1433.     attributes = None
  1434.     nodeType = Node.ENTITY_NODE
  1435.     nodeValue = None
  1436.     actualEncoding = None
  1437.     encoding = None
  1438.     version = None
  1439.     
  1440.     def __init__(self, name, publicId, systemId, notation):
  1441.         self.nodeName = name
  1442.         self.notationName = notation
  1443.         self.childNodes = NodeList()
  1444.         self._identified_mixin_init(publicId, systemId)
  1445.  
  1446.     
  1447.     def _get_actualEncoding(self):
  1448.         return self.actualEncoding
  1449.  
  1450.     
  1451.     def _get_encoding(self):
  1452.         return self.encoding
  1453.  
  1454.     
  1455.     def _get_version(self):
  1456.         return self.version
  1457.  
  1458.     
  1459.     def appendChild(self, newChild):
  1460.         raise xml.dom.HierarchyRequestErr('cannot append children to an entity node')
  1461.  
  1462.     
  1463.     def insertBefore(self, newChild, refChild):
  1464.         raise xml.dom.HierarchyRequestErr('cannot insert children below an entity node')
  1465.  
  1466.     
  1467.     def removeChild(self, oldChild):
  1468.         raise xml.dom.HierarchyRequestErr('cannot remove children from an entity node')
  1469.  
  1470.     
  1471.     def replaceChild(self, newChild, oldChild):
  1472.         raise xml.dom.HierarchyRequestErr('cannot replace children of an entity node')
  1473.  
  1474.  
  1475.  
  1476. class Notation(Identified, Childless, Node):
  1477.     nodeType = Node.NOTATION_NODE
  1478.     nodeValue = None
  1479.     
  1480.     def __init__(self, name, publicId, systemId):
  1481.         self.nodeName = name
  1482.         self._identified_mixin_init(publicId, systemId)
  1483.  
  1484.  
  1485.  
  1486. class DOMImplementation(DOMImplementationLS):
  1487.     _features = [
  1488.         ('core', '1.0'),
  1489.         ('core', '2.0'),
  1490.         ('core', '3.0'),
  1491.         ('core', None),
  1492.         ('xml', '1.0'),
  1493.         ('xml', '2.0'),
  1494.         ('xml', '3.0'),
  1495.         ('xml', None),
  1496.         ('ls-load', '3.0'),
  1497.         ('ls-load', None)]
  1498.     
  1499.     def hasFeature(self, feature, version):
  1500.         if version == '':
  1501.             version = None
  1502.         
  1503.         return (feature.lower(), version) in self._features
  1504.  
  1505.     
  1506.     def createDocument(self, namespaceURI, qualifiedName, doctype):
  1507.         if doctype and doctype.parentNode is not None:
  1508.             raise xml.dom.WrongDocumentErr('doctype object owned by another DOM tree')
  1509.         
  1510.         doc = self._create_document()
  1511.         if namespaceURI is None and qualifiedName is None:
  1512.             pass
  1513.         add_root_element = not (doctype is None)
  1514.         if not qualifiedName and add_root_element:
  1515.             raise xml.dom.InvalidCharacterErr('Element with no name')
  1516.         
  1517.         if add_root_element:
  1518.             (prefix, localname) = _nssplit(qualifiedName)
  1519.             if prefix == 'xml' and namespaceURI != 'http://www.w3.org/XML/1998/namespace':
  1520.                 raise xml.dom.NamespaceErr("illegal use of 'xml' prefix")
  1521.             
  1522.             if prefix and not namespaceURI:
  1523.                 raise xml.dom.NamespaceErr('illegal use of prefix without namespaces')
  1524.             
  1525.             element = doc.createElementNS(namespaceURI, qualifiedName)
  1526.             if doctype:
  1527.                 doc.appendChild(doctype)
  1528.             
  1529.             doc.appendChild(element)
  1530.         
  1531.         if doctype:
  1532.             doctype.parentNode = doctype.ownerDocument = doc
  1533.         
  1534.         doc.doctype = doctype
  1535.         doc.implementation = self
  1536.         return doc
  1537.  
  1538.     
  1539.     def createDocumentType(self, qualifiedName, publicId, systemId):
  1540.         doctype = DocumentType(qualifiedName)
  1541.         doctype.publicId = publicId
  1542.         doctype.systemId = systemId
  1543.         return doctype
  1544.  
  1545.     
  1546.     def getInterface(self, feature):
  1547.         if self.hasFeature(feature, None):
  1548.             return self
  1549.         else:
  1550.             return None
  1551.  
  1552.     
  1553.     def _create_document(self):
  1554.         return Document()
  1555.  
  1556.  
  1557.  
  1558. class ElementInfo(NewStyle):
  1559.     '''Object that represents content-model information for an element.
  1560.  
  1561.     This implementation is not expected to be used in practice; DOM
  1562.     builders should provide implementations which do the right thing
  1563.     using information available to it.
  1564.  
  1565.     '''
  1566.     __slots__ = ('tagName',)
  1567.     
  1568.     def __init__(self, name):
  1569.         self.tagName = name
  1570.  
  1571.     
  1572.     def getAttributeType(self, aname):
  1573.         return _no_type
  1574.  
  1575.     
  1576.     def getAttributeTypeNS(self, namespaceURI, localName):
  1577.         return _no_type
  1578.  
  1579.     
  1580.     def isElementContent(self):
  1581.         return False
  1582.  
  1583.     
  1584.     def isEmpty(self):
  1585.         '''Returns true iff this element is declared to have an EMPTY
  1586.         content model.'''
  1587.         return False
  1588.  
  1589.     
  1590.     def isId(self, aname):
  1591.         '''Returns true iff the named attribte is a DTD-style ID.'''
  1592.         return False
  1593.  
  1594.     
  1595.     def isIdNS(self, namespaceURI, localName):
  1596.         '''Returns true iff the identified attribute is a DTD-style ID.'''
  1597.         return False
  1598.  
  1599.     
  1600.     def __getstate__(self):
  1601.         return self.tagName
  1602.  
  1603.     
  1604.     def __setstate__(self, state):
  1605.         self.tagName = state
  1606.  
  1607.  
  1608.  
  1609. def _clear_id_cache(node):
  1610.     if node.nodeType == Node.DOCUMENT_NODE:
  1611.         node._id_cache.clear()
  1612.         node._id_search_stack = None
  1613.     elif _in_document(node):
  1614.         node.ownerDocument._id_cache.clear()
  1615.         node.ownerDocument._id_search_stack = None
  1616.     
  1617.  
  1618.  
  1619. class Document(Node, DocumentLS):
  1620.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE)
  1621.     nodeType = Node.DOCUMENT_NODE
  1622.     nodeName = '#document'
  1623.     nodeValue = None
  1624.     attributes = None
  1625.     doctype = None
  1626.     parentNode = None
  1627.     previousSibling = None
  1628.     nextSibling = None
  1629.     implementation = DOMImplementation()
  1630.     actualEncoding = None
  1631.     encoding = None
  1632.     standalone = None
  1633.     version = None
  1634.     strictErrorChecking = False
  1635.     errorHandler = None
  1636.     documentURI = None
  1637.     _magic_id_count = 0
  1638.     
  1639.     def __init__(self):
  1640.         self.childNodes = NodeList()
  1641.         self._elem_info = { }
  1642.         self._id_cache = { }
  1643.         self._id_search_stack = None
  1644.  
  1645.     
  1646.     def _get_elem_info(self, element):
  1647.         if element.namespaceURI:
  1648.             key = (element.namespaceURI, element.localName)
  1649.         else:
  1650.             key = element.tagName
  1651.         return self._elem_info.get(key)
  1652.  
  1653.     
  1654.     def _get_actualEncoding(self):
  1655.         return self.actualEncoding
  1656.  
  1657.     
  1658.     def _get_doctype(self):
  1659.         return self.doctype
  1660.  
  1661.     
  1662.     def _get_documentURI(self):
  1663.         return self.documentURI
  1664.  
  1665.     
  1666.     def _get_encoding(self):
  1667.         return self.encoding
  1668.  
  1669.     
  1670.     def _get_errorHandler(self):
  1671.         return self.errorHandler
  1672.  
  1673.     
  1674.     def _get_standalone(self):
  1675.         return self.standalone
  1676.  
  1677.     
  1678.     def _get_strictErrorChecking(self):
  1679.         return self.strictErrorChecking
  1680.  
  1681.     
  1682.     def _get_version(self):
  1683.         return self.version
  1684.  
  1685.     
  1686.     def appendChild(self, node):
  1687.         if node.nodeType not in self._child_node_types:
  1688.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  1689.         
  1690.         if node.parentNode is not None:
  1691.             node.parentNode.removeChild(node)
  1692.         
  1693.         if node.nodeType == Node.ELEMENT_NODE and self._get_documentElement():
  1694.             raise xml.dom.HierarchyRequestErr('two document elements disallowed')
  1695.         
  1696.         return Node.appendChild(self, node)
  1697.  
  1698.     
  1699.     def removeChild(self, oldChild):
  1700.         
  1701.         try:
  1702.             self.childNodes.remove(oldChild)
  1703.         except ValueError:
  1704.             raise xml.dom.NotFoundErr()
  1705.  
  1706.         oldChild.nextSibling = None
  1707.         oldChild.previousSibling = None
  1708.         oldChild.parentNode = None
  1709.         if self.documentElement is oldChild:
  1710.             self.documentElement = None
  1711.         
  1712.         return oldChild
  1713.  
  1714.     
  1715.     def _get_documentElement(self):
  1716.         for node in self.childNodes:
  1717.             if node.nodeType == Node.ELEMENT_NODE:
  1718.                 return node
  1719.                 continue
  1720.         
  1721.  
  1722.     
  1723.     def unlink(self):
  1724.         if self.doctype is not None:
  1725.             self.doctype.unlink()
  1726.             self.doctype = None
  1727.         
  1728.         Node.unlink(self)
  1729.  
  1730.     
  1731.     def cloneNode(self, deep):
  1732.         if not deep:
  1733.             return None
  1734.         
  1735.         clone = self.implementation.createDocument(None, None, None)
  1736.         clone.encoding = self.encoding
  1737.         clone.standalone = self.standalone
  1738.         clone.version = self.version
  1739.         for n in self.childNodes:
  1740.             childclone = _clone_node(n, deep, clone)
  1741.             if not childclone.ownerDocument.isSameNode(clone):
  1742.                 raise AssertionError
  1743.             clone.childNodes.append(childclone)
  1744.             if childclone.nodeType == Node.DOCUMENT_NODE:
  1745.                 if not clone.documentElement is None:
  1746.                     raise AssertionError
  1747.             elif childclone.nodeType == Node.DOCUMENT_TYPE_NODE:
  1748.                 if not clone.doctype is None:
  1749.                     raise AssertionError
  1750.                 clone.doctype = childclone
  1751.             
  1752.             childclone.parentNode = clone
  1753.         
  1754.         self._call_user_data_handler(xml.dom.UserDataHandler.NODE_CLONED, self, clone)
  1755.         return clone
  1756.  
  1757.     
  1758.     def createDocumentFragment(self):
  1759.         d = DocumentFragment()
  1760.         d.ownerDocument = self
  1761.         return d
  1762.  
  1763.     
  1764.     def createElement(self, tagName):
  1765.         e = Element(tagName)
  1766.         e.ownerDocument = self
  1767.         return e
  1768.  
  1769.     
  1770.     def createTextNode(self, data):
  1771.         if not isinstance(data, StringTypes):
  1772.             raise TypeError, 'node contents must be a string'
  1773.         
  1774.         t = Text()
  1775.         t.data = data
  1776.         t.ownerDocument = self
  1777.         return t
  1778.  
  1779.     
  1780.     def createCDATASection(self, data):
  1781.         if not isinstance(data, StringTypes):
  1782.             raise TypeError, 'node contents must be a string'
  1783.         
  1784.         c = CDATASection()
  1785.         c.data = data
  1786.         c.ownerDocument = self
  1787.         return c
  1788.  
  1789.     
  1790.     def createComment(self, data):
  1791.         c = Comment(data)
  1792.         c.ownerDocument = self
  1793.         return c
  1794.  
  1795.     
  1796.     def createProcessingInstruction(self, target, data):
  1797.         p = ProcessingInstruction(target, data)
  1798.         p.ownerDocument = self
  1799.         return p
  1800.  
  1801.     
  1802.     def createAttribute(self, qName):
  1803.         a = Attr(qName)
  1804.         a.ownerDocument = self
  1805.         a.value = ''
  1806.         return a
  1807.  
  1808.     
  1809.     def createElementNS(self, namespaceURI, qualifiedName):
  1810.         (prefix, localName) = _nssplit(qualifiedName)
  1811.         e = Element(qualifiedName, namespaceURI, prefix)
  1812.         e.ownerDocument = self
  1813.         return e
  1814.  
  1815.     
  1816.     def createAttributeNS(self, namespaceURI, qualifiedName):
  1817.         (prefix, localName) = _nssplit(qualifiedName)
  1818.         a = Attr(qualifiedName, namespaceURI, localName, prefix)
  1819.         a.ownerDocument = self
  1820.         a.value = ''
  1821.         return a
  1822.  
  1823.     
  1824.     def _create_entity(self, name, publicId, systemId, notationName):
  1825.         e = Entity(name, publicId, systemId, notationName)
  1826.         e.ownerDocument = self
  1827.         return e
  1828.  
  1829.     
  1830.     def _create_notation(self, name, publicId, systemId):
  1831.         n = Notation(name, publicId, systemId)
  1832.         n.ownerDocument = self
  1833.         return n
  1834.  
  1835.     
  1836.     def getElementById(self, id):
  1837.         if self._id_cache.has_key(id):
  1838.             return self._id_cache[id]
  1839.         
  1840.         if not self._elem_info or self._magic_id_count:
  1841.             return None
  1842.         
  1843.         stack = self._id_search_stack
  1844.         if stack is None:
  1845.             stack = [
  1846.                 self.documentElement]
  1847.             self._id_search_stack = stack
  1848.         elif not stack:
  1849.             return None
  1850.         
  1851.         result = None
  1852.         for child in node.childNodes:
  1853.             if child.nodeType in _nodeTypes_with_children:
  1854.                 continue
  1855.             _[1][child]
  1856.             continue
  1857.             [](_[1])
  1858.             info = self._get_elem_info(node)
  1859.             if info:
  1860.                 for attr in node.attributes.values():
  1861.                     if attr.namespaceURI:
  1862.                         if info.isIdNS(attr.namespaceURI, attr.localName):
  1863.                             self._id_cache[attr.value] = node
  1864.                             if attr.value == id:
  1865.                                 result = node
  1866.                             elif not node._magic_id_nodes:
  1867.                                 break
  1868.                             
  1869.                         
  1870.                     info.isIdNS(attr.namespaceURI, attr.localName)
  1871.                     if info.isId(attr.name):
  1872.                         self._id_cache[attr.value] = node
  1873.                         if attr.value == id:
  1874.                             result = node
  1875.                         elif not node._magic_id_nodes:
  1876.                             break
  1877.                         
  1878.                     attr.value == id
  1879.                     if attr._is_id:
  1880.                         self._id_cache[attr.value] = node
  1881.                         if attr.value == id:
  1882.                             result = node
  1883.                         elif node._magic_id_nodes == 1:
  1884.                             break
  1885.                         
  1886.                     attr.value == id
  1887.                 
  1888.             elif node._magic_id_nodes:
  1889.                 for attr in node.attributes.values():
  1890.                     if attr._is_id:
  1891.                         self._id_cache[attr.value] = node
  1892.                         if attr.value == id:
  1893.                             result = node
  1894.                         
  1895.                     attr.value == id
  1896.                 
  1897.             
  1898.             if result is not None:
  1899.                 break
  1900.                 continue
  1901.         return result
  1902.  
  1903.     
  1904.     def getElementsByTagName(self, name):
  1905.         return _get_elements_by_tagName_helper(self, name, NodeList())
  1906.  
  1907.     
  1908.     def getElementsByTagNameNS(self, namespaceURI, localName):
  1909.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  1910.  
  1911.     
  1912.     def isSupported(self, feature, version):
  1913.         return self.implementation.hasFeature(feature, version)
  1914.  
  1915.     
  1916.     def importNode(self, node, deep):
  1917.         if node.nodeType == Node.DOCUMENT_NODE:
  1918.             raise xml.dom.NotSupportedErr('cannot import document nodes')
  1919.         elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1920.             raise xml.dom.NotSupportedErr('cannot import document type nodes')
  1921.         
  1922.         return _clone_node(node, deep, self)
  1923.  
  1924.     
  1925.     def writexml(self, writer, indent = '', addindent = '', newl = '', encoding = None):
  1926.         if encoding is None:
  1927.             writer.write('<?xml version="1.0" ?>' + newl)
  1928.         else:
  1929.             writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
  1930.         for node in self.childNodes:
  1931.             node.writexml(writer, indent, addindent, newl)
  1932.         
  1933.  
  1934.     
  1935.     def renameNode(self, n, namespaceURI, name):
  1936.         if n.ownerDocument is not self:
  1937.             raise xml.dom.WrongDocumentErr('cannot rename nodes from other documents;\nexpected %s,\nfound %s' % (self, n.ownerDocument))
  1938.         
  1939.         if n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE):
  1940.             raise xml.dom.NotSupportedErr('renameNode() only applies to element and attribute nodes')
  1941.         
  1942.         if namespaceURI != EMPTY_NAMESPACE:
  1943.             if ':' in name:
  1944.                 (prefix, localName) = name.split(':', 1)
  1945.                 if prefix == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE:
  1946.                     raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix")
  1947.                 
  1948.             elif name == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE and n.nodeType == Node.ATTRIBUTE_NODE:
  1949.                 raise xml.dom.NamespaceErr("illegal use of the 'xmlns' attribute")
  1950.             
  1951.             prefix = None
  1952.             localName = name
  1953.         else:
  1954.             prefix = None
  1955.             localName = None
  1956.         if n.nodeType == Node.ATTRIBUTE_NODE:
  1957.             element = n.ownerElement
  1958.             if element is not None:
  1959.                 is_id = n._is_id
  1960.                 element.removeAttributeNode(n)
  1961.             
  1962.         else:
  1963.             element = None
  1964.         d = n.__dict__
  1965.         d['prefix'] = prefix
  1966.         d['localName'] = localName
  1967.         d['namespaceURI'] = namespaceURI
  1968.         d['nodeName'] = name
  1969.         if n.nodeType == Node.ELEMENT_NODE:
  1970.             d['tagName'] = name
  1971.         else:
  1972.             d['name'] = name
  1973.             if element is not None:
  1974.                 element.setAttributeNode(n)
  1975.                 if is_id:
  1976.                     element.setIdAttributeNode(n)
  1977.                 
  1978.             
  1979.         return n
  1980.  
  1981.  
  1982. defproperty(Document, 'documentElement', doc = 'Top-level element of this document.')
  1983.  
  1984. def _clone_node(node, deep, newOwnerDocument):
  1985.     '''
  1986.     Clone a node and give it the new owner document.
  1987.     Called by Node.cloneNode and Document.importNode
  1988.     '''
  1989.     if node.ownerDocument.isSameNode(newOwnerDocument):
  1990.         operation = xml.dom.UserDataHandler.NODE_CLONED
  1991.     else:
  1992.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1993.     if node.nodeType == Node.ELEMENT_NODE:
  1994.         clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName)
  1995.         for attr in node.attributes.values():
  1996.             clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value)
  1997.             a = clone.getAttributeNodeNS(attr.namespaceURI, attr.localName)
  1998.             a.specified = attr.specified
  1999.         
  2000.         if deep:
  2001.             for child in node.childNodes:
  2002.                 c = _clone_node(child, deep, newOwnerDocument)
  2003.                 clone.appendChild(c)
  2004.             
  2005.         
  2006.     elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
  2007.         clone = newOwnerDocument.createDocumentFragment()
  2008.         if deep:
  2009.             for child in node.childNodes:
  2010.                 c = _clone_node(child, deep, newOwnerDocument)
  2011.                 clone.appendChild(c)
  2012.             
  2013.         
  2014.     elif node.nodeType == Node.TEXT_NODE:
  2015.         clone = newOwnerDocument.createTextNode(node.data)
  2016.     elif node.nodeType == Node.CDATA_SECTION_NODE:
  2017.         clone = newOwnerDocument.createCDATASection(node.data)
  2018.     elif node.nodeType == Node.PROCESSING_INSTRUCTION_NODE:
  2019.         clone = newOwnerDocument.createProcessingInstruction(node.target, node.data)
  2020.     elif node.nodeType == Node.COMMENT_NODE:
  2021.         clone = newOwnerDocument.createComment(node.data)
  2022.     elif node.nodeType == Node.ATTRIBUTE_NODE:
  2023.         clone = newOwnerDocument.createAttributeNS(node.namespaceURI, node.nodeName)
  2024.         clone.specified = True
  2025.         clone.value = node.value
  2026.     elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  2027.         if not node.ownerDocument is not newOwnerDocument:
  2028.             raise AssertionError
  2029.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  2030.         clone = newOwnerDocument.implementation.createDocumentType(node.name, node.publicId, node.systemId)
  2031.         clone.ownerDocument = newOwnerDocument
  2032.         if deep:
  2033.             clone.entities._seq = []
  2034.             clone.notations._seq = []
  2035.             for n in node.notations._seq:
  2036.                 notation = Notation(n.nodeName, n.publicId, n.systemId)
  2037.                 notation.ownerDocument = newOwnerDocument
  2038.                 clone.notations._seq.append(notation)
  2039.                 if hasattr(n, '_call_user_data_handler'):
  2040.                     n._call_user_data_handler(operation, n, notation)
  2041.                     continue
  2042.             
  2043.             for e in node.entities._seq:
  2044.                 entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  2045.                 entity.actualEncoding = e.actualEncoding
  2046.                 entity.encoding = e.encoding
  2047.                 entity.version = e.version
  2048.                 entity.ownerDocument = newOwnerDocument
  2049.                 clone.entities._seq.append(entity)
  2050.                 if hasattr(e, '_call_user_data_handler'):
  2051.                     e._call_user_data_handler(operation, n, entity)
  2052.                     continue
  2053.             
  2054.         
  2055.     else:
  2056.         raise xml.dom.NotSupportedErr('Cannot clone node %s' % repr(node))
  2057.     if hasattr(node, '_call_user_data_handler'):
  2058.         node._call_user_data_handler(operation, node, clone)
  2059.     
  2060.     return clone
  2061.  
  2062.  
  2063. def _nssplit(qualifiedName):
  2064.     fields = qualifiedName.split(':', 1)
  2065.     if len(fields) == 2:
  2066.         return fields
  2067.     else:
  2068.         return (None, fields[0])
  2069.  
  2070.  
  2071. def _get_StringIO():
  2072.     StringIO = StringIO
  2073.     import StringIO
  2074.     return StringIO()
  2075.  
  2076.  
  2077. def _do_pulldom_parse(func, args, kwargs):
  2078.     events = func(*args, **kwargs)
  2079.     (toktype, rootNode) = events.getEvent()
  2080.     events.expandNode(rootNode)
  2081.     events.clear()
  2082.     return rootNode
  2083.  
  2084.  
  2085. def parse(file, parser = None, bufsize = None):
  2086.     '''Parse a file into a DOM by filename or file object.'''
  2087.     if parser is None and not bufsize:
  2088.         expatbuilder = expatbuilder
  2089.         import xml.dom
  2090.         return expatbuilder.parse(file)
  2091.     else:
  2092.         pulldom = pulldom
  2093.         import xml.dom
  2094.         return _do_pulldom_parse(pulldom.parse, (file,), {
  2095.             'parser': parser,
  2096.             'bufsize': bufsize })
  2097.  
  2098.  
  2099. def parseString(string, parser = None):
  2100.     '''Parse a file into a DOM from a string.'''
  2101.     if parser is None:
  2102.         expatbuilder = expatbuilder
  2103.         import xml.dom
  2104.         return expatbuilder.parseString(string)
  2105.     else:
  2106.         pulldom = pulldom
  2107.         import xml.dom
  2108.         return _do_pulldom_parse(pulldom.parseString, (string,), {
  2109.             'parser': parser })
  2110.  
  2111.  
  2112. def getDOMImplementation(features = None):
  2113.     if features:
  2114.         if isinstance(features, StringTypes):
  2115.             features = domreg._parse_feature_string(features)
  2116.         
  2117.         for f, v in features:
  2118.             if not Document.implementation.hasFeature(f, v):
  2119.                 return None
  2120.                 continue
  2121.         
  2122.     
  2123.     return Document.implementation
  2124.  
  2125.